#ifndef __PID_H__
#define __PID_H__

#include "main.h"

#define PID_KP 2
#define PID_KI 0.2
#define PID_KD 10
#define PID_MAX_OUT 16000
#define PID_MAX_IOUT 2000

// pid变量结构体
struct Pid
{
    uint8_t mode;//pid模式,0:位置式; 1:增量式

    float goal_value;   // 目标值
    float actual_value; // 实际值

    float err[3]; // 误差,0:此次误差,1:上次误差,2:数据填充位/上上次误差

    float kp, ki, kd; // 系数

    float out;//最终输出
    float delta;
    float pout;//比例部分
    float iout;//积分部分
    float dout;//微分部分

    float max_out;//最大输出
    float max_iout;//最大累计误差输出
};

typedef struct
{

    float angle_now;
    float angle_last;
    float angle_acc;//角度累计

    float delt[2];//角度变化量记录数组,0:此次变化,1:上次变化

    float death_angle;//死区
}Angle;


void limit_value(float *value, int max_value);
void pid_init(struct Pid *pid, const float pid_k[3], uint32_t max_out, uint32_t max_iout, uint8_t mode);
float pid_calculate(struct Pid *pid, float goal_value, float actual_value);
void pid_k_set(struct Pid *pid, float kp, float ki, float kd);

void angle_init(Angle *angle, float death_angle);
float angle_cal(Angle *angle, float real_angle);
void pid_pos_cas(Angle *angle, struct Pid *pid_s, struct Pid *pid_p, float set_angle, float real_angle, int real_speed);





#endif 
